#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
批量视频添加文本工具
可以指定一个目录，将目录中的所有视频文件添加指定文本
"""

import os
import sys
from pathlib import Path
import argparse
from typing import List, Dict, Any

# 添加项目根目录到Python路径
project_root = Path(__file__).parent
sys.path.append(str(project_root))

from src.processors.video_text_overlay import add_text_to_video

def get_video_files(directory: str) -> List[str]:
    """
    获取目录中的所有视频文件
    
    Args:
        directory (str): 目录路径
        
    Returns:
        List[str]: 视频文件路径列表
    """
    video_extensions = {'.mp4', '.avi', '.mov', '.mkv', '.flv', '.wmv', '.webm', '.m4v'}
    video_files = []
    
    for root, _, files in os.walk(directory):
        for file in files:
            if Path(file).suffix.lower() in video_extensions:
                video_files.append(os.path.join(root, file))
    
    return video_files

def create_text_config(text: str, position: tuple = ('center', 'center'), 
                      fontsize: int = 50, color: str = 'yellow',
                      duration: float = 5.0, start_time: float = 0.0,
                      **kwargs) -> List[Dict[str, Any]]:
    """
    创建文本配置
    
    Args:
        text (str): 要添加的文本
        position (tuple): 文本位置，默认为居中
        fontsize (int): 字体大小
        color (str): 字本颜色
        duration (float): 持续时间
        start_time (float): 开始时间
        **kwargs: 其他参数
        
    Returns:
        List[Dict[str, Any]]: 文本配置列表
    """
    config = {
        'text': text,
        'position': position,
        'fontsize': fontsize,
        'color': color,
        'duration': duration,
        'start_time': start_time,
        'stroke_color': 'black',
        'stroke_width': 2,
        'add_shadow': True,
        'shadow_color': 'black',
        'shadow_offset': (3, 3)
    }
    
    # 添加其他参数
    for key, value in kwargs.items():
        config[key] = value
    
    return [config]

def process_videos(input_dir: str, output_dir: str, text: str, 
                  position: tuple = ('center', 'center'),
                  fontsize: int = 50, color: str = 'yellow',
                  duration: float = 5.0, start_time: float = 0.0,
                  **kwargs) -> None:
    """
    批量处理视频文件
    
    Args:
        input_dir (str): 输入目录
        output_dir (str): 输出目录
        text (str): 要添加的文本
        position (tuple): 文本位置
        fontsize (int): 字体大小
        color (str): 文本颜色
        duration (float): 持续时间
        start_time (float): 开始时间
        **kwargs: 其他参数
    """
    # 检查输入目录是否存在
    if not os.path.exists(input_dir):
        print(f"输入目录不存在: {input_dir}")
        return
    
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    
    # 获取视频文件列表
    video_files = get_video_files(input_dir)
    
    if not video_files:
        print(f"在目录 {input_dir} 中未找到视频文件")
        return
    
    print(f"找到 {len(video_files)} 个视频文件")
    
    # 创建文本配置
    texts = create_text_config(
        text=text,
        position=position,
        fontsize=fontsize,
        color=color,
        duration=duration,
        start_time=start_time,
        **kwargs
    )
    
    # 处理每个视频文件
    for i, video_path in enumerate(video_files, 1):
        print(f"\n处理第 {i}/{len(video_files)} 个视频: {video_path}")
        
        # 生成输出文件路径
        video_name = Path(video_path).stem
        video_ext = Path(video_path).suffix
        output_path = os.path.join(output_dir, f"{video_name}_with_text{video_ext}")
        
        # 检查输出文件是否已存在
        if os.path.exists(output_path):
            print(f"输出文件已存在，跳过: {output_path}")
            continue
        
        # 添加文本到视频
        try:
            success = add_text_to_video(video_path, output_path, texts)
            if success:
                print(f"✅ 成功处理: {output_path}")
            else:
                print(f"❌ 处理失败: {video_path}")
        except Exception as e:
            print(f"处理视频 {video_path} 时出错: {e}")

def main():
    """主函数"""
    parser = argparse.ArgumentParser(description='批量给视频添加文本')
    parser.add_argument('input_dir', help='输入视频目录')
    parser.add_argument('output_dir', help='输出视频目录')
    parser.add_argument('text', help='要添加的文本')
    parser.add_argument('--position', nargs=2, default=['center', 'center'],
                       help='文本位置 (x y)，例如: center bottom')
    parser.add_argument('--fontsize', type=int, default=50, help='字体大小')
    parser.add_argument('--color', default='yellow', help='文本颜色')
    parser.add_argument('--duration', type=float, default=5.0, help='文本持续时间(秒)')
    parser.add_argument('--start-time', type=float, default=0.0, help='文本开始时间(秒)')
    parser.add_argument('--max-width', type=int, help='文本最大宽度(像素)')
    
    args = parser.parse_args()
    
    # 处理参数
    kwargs = {}
    if args.max_width:
        kwargs['max_width'] = args.max_width
    
    # 批量处理视频
    process_videos(
        input_dir=args.input_dir,
        output_dir=args.output_dir,
        text=args.text,
        position=tuple(args.position),
        fontsize=args.fontsize,
        color=args.color,
        duration=args.duration,
        start_time=args.start_time,
        **kwargs
    )

if __name__ == "__main__":
    main()